Stata与Python等价命令
👇 连享会 · 推文导航 | www.lianxh.cn
🍎 Stata:Stata基础 | Stata绘图 | Stata程序 | Stata新命令 📘 论文:数据处理 | 结果输出 | 论文写作 | 数据分享 💹 计量:回归分析 | 交乘项-调节 | IV-GMM | 时间序列 | 面板数据 | 空间计量 | Probit-Logit | 分位数回归 ⛳ 专题:SFA-DEA | 生存分析 | 爬虫 | 机器学习 | 文本分析 🔃 因果:DID | RDD | 因果推断 | 合成控制法 | PSM-Matching 🔨 工具:工具软件 | Markdown | Python-R-Stata 🎧 课程:公开课-直播 | 计量专题 | 关于连享会
连享会 · 效率分析专题
作者:刘欣妍 (香港中文大学)
邮箱:liuxinyan@link.cuhk.edu.hk
温馨提示: 文中链接在微信中无法生效。请点击底部「阅读原文」。或直接长按/扫描如下二维码,直达原文:
编者按:本文主要参考自「Stata to Python Equivalents」,特此致谢!
目录
1. 写在前面
2. 数据导入与导出
3. 样本选择
4. 数据描述性统计
5. 变量操作
6. bysort 函数
7. 面板数据
8. 数据的合并
9. reshape 命令
10. 计量中常用命令
11. 画图
12. 缺失值以及浮动点
13. 相关推文
1. 写在前面
在 Python 中编码与在 Stata 中编码有很多不同的。
首先,在 Stata 中,内存中有一个数据集。这个数据集是一个矩阵,每一列都是一个具有唯一名称的 “变量”,每一行都有一个数字 (特殊变量 _n)。Stata 中的所有东西都是围绕这个范式建立的。
对比来看,Python 是一种通用的编程语言,此时的 “变量” 不再只是一列数据。变量可以是任何东西,一个数字,一个矩阵,一个列表,一个字符串等等。Pandas 包有一种叫做 DataFrame 的数据格式,其作用很像 Stata 中的单一数据集。它是一个矩阵,每一列和每一行都有一个名字。
与 Stata 不同,DataFrame 本身就是一个变量,你可以同时处理任意数量的 DataFrame,也可以把 DataFrame 中的每一列看作是一个变量 (就像在 Stata 中一样)。当你引用一列时,你需要先指定 DataFrame,然后再进行引用。
2. 数据导入与导出
接下来,笔者将通过表格的形式对比 Stata 与 Python 在数据导入、导出中常用的命令,以及两者命令的相互替换。
Stata | Python |
---|---|
log using <file> | Python 不像 Stata 那样自动显示结果。你必须明确地调用 print 函数。因此使用 Jupyter 笔记本是最类似的形式。 |
help <command> | help(<command>) or <command>? |
cd some/other/directory | import os os.chdir('some/other/directory') |
use my_file | import pandas as pd df = pd.read_stata('my_file.dta') |
use var1 var2 using my_file | df = pd.read_stata('my_file.dta', columns=['var1', 'var2']) |
import excel using <excelfile> | df = pd.read_excel('<excelfile>') |
import delimited using my_file.csv | df = pd.read_csv('my_file.csv') |
save my_file, replace | df.to_stata('my_file.dta') OR df.to_pickle('my_file.pkl') |
outsheet using my_file.csv, comma | df.to_csv('my_file.csv') |
export excel using <excel_name> | df.to_excel('<excel_name>') |
3. 样本选择
这一模块介绍了 Stata 常用的样本选择代码,以及其对应的 Python 代码。
Stata | Python |
---|---|
keep if <condition> | df = df[<condition>] |
keep if a > 7 | df = df[df['a'] > 7] |
drop if <condition> | df = df[~(<condition>)] |
keep if _n == 1 | df.first() OR df.iloc[0, :] 这里需要注意的是,Python 是以 0 开始的索引语言。所以在计算列表和数组的元素时,我们需要从从 0 开始而不是 1。 |
keep if _n == _N | df = df.last() OR df = df.iloc[-1, :] |
keep if _n == 7 | df = df.iloc[6, :] 记得 Python 是从 0 开始计算的 |
keep if _n <= 10 | df = df.iloc[:9, :] |
keep var | df = df['var'] |
keep var1 var2 | df = df[['var1', 'var2']] |
keep varstem* | df = df.filter(like='varstem') |
drop var | del df['var'] OR df = df.drop('var', axis=1) |
drop var1 var2 | df = df.drop(['var1', 'var2'], axis=1) |
drop varstem* | df = df.drop(df.filter(like='varstem*').columns, axis=1) |
4. 数据描述性统计
Stata | Python |
---|---|
describe | df.info() ORdf.dtypes |
describe var | df['var'].dtype |
count | df.shape[0] ORlen(df) . |
count if <condition> | df[<condition>].shape[0] OR(<condition>).sum() |
summ var | df['var'].describe() |
summ var if <condition> | df[<condition>]['var'].describe() OR df.loc[<condition>, 'var'].describe() |
summ var [aw = <weight>] | 目前来说,Python 中需要手动计算加权的汇总统计。Statsmodels 软件包中有需要的内容。 |
summ var, d | df['var'].describe() plus df['var'].quantile([.1, .25, .5, .75, .9]) |
tab var | df['var'].value_counts() |
tab var1 var2 | pd.crosstab(df['var1'], df['var2']) df.groupby(['var1', 'var2']) .size() .unstack('var2') |
tab <var1> <var2>, summarize(<func>) | df.groupby(['var1', 'var2']) .agg(<func>) .unstack('var2') |
5. 变量操作
Stata | Python |
---|---|
gen newvar = <expression> | df['newvar'] = <expression> |
gen newvar = oldvar + 7 | df['newvar'] = df['oldvar'] + 7 |
gen newvar = <expression> if <condition> | df.loc[<condition>, 'newvar'] = <expression> 与 Stata 一样,不满足条件的将变成缺失值 |
replace var = <expression> if <condition> | df.loc[<condition>, 'var'] = <expression> |
rename var newvar | df = df.rename(columns={'var': 'newvar'}) |
inlist(var, <val1>, <val2>) | df['var'].isin((<val1>, <val2>)) |
inrange(var, <val1>, <val2>) | df['var'].between((<val1>, <val2>)) |
subinstr(<str>, " ", "_", .) | df['var'].str.replace(' ', '_') |
egen newvar = count(var) | newvar = df['var'].notnull().sum() |
egen <newvar> = max(var) | <newvar> = df['var'].max() |
egen <newvar> = mean(var) | <newvar> = df['var'].mean() |
egen <newvar> = total(var) | <newvar> = df['var'].sum() |
egen <newvar> = group(var1 var2) | <newvar> = econtools.group_id(df, cols=['var1', 'var2]) |
egen newvar = <stat>(var), by(groupvar1 groupvar2) | df['newvar'] = df.groupby(['groupvar1', 'groupvar2']) ['var'].transform('<stat>') |
collapse (sd) var (median) var /// (max) var (min) var ///, by(groupvar1 groupvar2) | df.groupby(['groupvar1', 'groupvar2'])['var'] .agg(['std', 'median', 'min', 'max', 'sum']) |
collapse (<stat>) var [iw = <weight>] | 目前来说,Python 中需要手动计算加权的汇总统计。 Statsmodels 软件包中有需要的内容。 |
collapse (mean) var1, var2, by(groupvar1 groupvar2) | df.groupby(['groupvar1', 'groupvar2'])[['var1', 'var2']].mean() |
6. bysort 函数
Stata 里的 bysort
和 egen
命令可以在 Python 中使用 groupby.agg
或 groupby.transform
进行转换。
Stata | Python |
---|---|
bys group_var1 group_var2: gen group_sum = sum(var) | df['group_sum'] = df.groupby(['group_var1', 'group_var2'])['var'].transform('sum') df['group_sum'] = df.groupby(['group_var1', 'group_var2'])['var'].transform(np.sum) |
bys group_var1 group_var2 (sort_var): keep if _n==1 | 1. df['group_sum'] = (df .sort_values(['group_var1', 'group_var2', 'sort_var1']) .drop_duplicates(['group_var1', 'group_var2'], keep='first')) 2. df['group_sum'] = (df .sort_values(['group_var1', 'group_var2', 'sort_var1']) .groupby(['var1', 'var2']).first()) |
bys group_var1 group_var2 (sort_var): keep if _n==j ,其中 j 是任意数 | df['group_sum'] = (df.sort_values(['group_var1', 'group_var2', 'sort_var1']) .groupby(['var1', 'var2']).apply(lambda x: x.iloc[j, :])) |
bys group_var1 group_var2 (sort_var): gen jth_val = var[j] ,其中 j 是任意数 | df['jth_val'] = (df.sort_values(['group_var1', 'group_var2', 'sort_var1']) .groupby(['var1', 'var2'])['var'].transform(lambda x: x.iloc[j])) |
7. 面板数据
在 Python 中没有直接与 Stata 的 tsset
一致的命令,但是你可以利用 Python 中的 Index 来解决这个问题。
Stata | Python |
---|---|
tsset panelvar timevar | df = df.set_index(['panelvar', 'timevar']) |
L.var | df['var'].shift() |
L2.var | df['var'].shift(2) |
F.var | df['var'].shift(-1) |
8. 数据的合并
在 Python 中并不需要指名是一对一或者一对多,Pandas 会根据你要合并的变量是否是唯一来解决这个问题。
Stata | Python |
---|---|
append using <filename> | df_joint = df1.append(df2) |
merge 1:1 <vars> using <filename> | df_joint = df1.join(df2) if <vars> are the DataFrames' indexes , ordf_joint = pd.merge(df1, df2, on=<vars>) |
9. reshape 命令
Stata 里的 reshape
命令在 Python 中基本是通过采用 stack
和 unstack
命令来解决。
Stata | Python |
---|---|
reshape <wide/long> <stubs>, i(<i_vars>) j(<j_var>) | wide: df.unstack(<level>) long: df.stack('j_var') see also df.pivot |
10. 计量中常用命令
Stata | Python |
---|---|
ttest var1, by(var2) | from scipy.stats import ttest_ind ttest_ind(array1, array2) |
xi: i.var | pd.get_dummies(df['var']) |
i.var2#c.var1 | pd.get_dummies(df[var2]).multiply(df[var1]) |
reg yvar xvar if <condition>, r | import econtools.metrics as mt results = mt.reg(df[<condition>], 'yvar', 'xvar', robust=True) |
reg yvar xvar if <condition>, vce(cluster cluster_var) | results = mt.reg(df[<condition>], 'yvar', 'xvar', cluster='cluster_var') |
areg yvar xvar1 xvar2, absorb(fe_var) | results = mt.reg(df, 'yvar', ['xvar1', 'xvar2'], fe_name='fe_var') |
predict newvar, resid | newvar = results.resid |
predict newvar, xb | newvar = results.yhat |
_b[var], _se[var] | results.beta['var'], results.se['var'] |
test var1 var2 | results.Ftest(['var1', 'var2']) |
test var1 var2, equal | results.Ftest(['var1', 'var2'], equal=True) |
lincom var1 + var2 | econtools.metrics.f_test |
ivreg2 | econtools.metrics.ivreg |
outreg2 | econtools.outreg |
11. 画图
Stata | Python |
---|---|
binscatter | econtools.binscatter |
maptile | 使用 Cartopy |
coefplot | ax.scatter(results.beta.index, results.beta) |
twoway scatter y_var x_var | df.scatter('x_var', 'y_var') |
twoway scatter y_var x_var if <condition> | df[<condition>].scatter(x_var, y_var) |
twoway <connected/line/area/bar/rarea> | 推荐直接使用 matplotlib 或 seaborn 函数 |
12. 缺失值以及浮动点
缺失值的不同:在 Python 中,缺失值是一个 “非数字” 的对象,并且用 np.nan
表示。在 Stata 中,缺失值 (.)
比每个数字都大,所以 10 < .
返回的结果为 True
。在 Python 中,np.nan
从不等于任何东西。任何涉及 np.nan
的比较都是假的,甚至是 np.nan == np.nan
。在 Python 中缺失值对应的代码有以下两种:
df[<varname>].isnull()
对每一行返回一个真或假的值;df[<varname>].notnull()
是df[<varname>].isnull()
的补充集。
浮动点:在 Stata 中,十进制数字永远不等于任何东西,例如 3.0 == 3
是假的。在 Python 中,只要浮点误差在公差范围内,上述相等检查就会返回 True
。
13. 相关推文
Note:产生如下推文列表的 Stata 命令为:
lianxh python, m
安装最新版lianxh
命令:
ssc install lianxh, replace
专题:数据分享 Python+Stata:如何获取中国气象历史数据 专题:Stata入门 使用 Jupyter Notebook 配置 Stata\Python\Julia\R 专题:Stata教程 Stata-Python交互-9:将python数据导入Stata Stata-Python交互-8:将Stata数据导入Python Stata-Python交互-7:在Stata中实现机器学习-支持向量机 Stata-Python交互-6:调用APIs和JSON数据 Stata-Python交互-5:边际效应三维立体图示 Stata-Python交互-4:如何调用Python宏包 Stata-Python交互-3:如何安装Python宏包 Stata-Python交互-2:在Stata中调用Python的三种方式 Stata-Python交互-1:二者配合的基本设定 专题:Stata程序 Stata程序:是否有类似-Python-中的-zip()-函数
课程推荐:因果推断实用计量方法
主讲老师:丘嘉平教授
🍓 课程主页:https://gitee.com/lianxh/YGqjp
New! Stata 搜索神器:
lianxh
和songbl
GIF 动图介绍
搜: 推文、数据分享、期刊论文、重现代码 ……
👉 安装:
. ssc install lianxh
. ssc install songbl
👉 使用:
. lianxh DID 倍分法
. songbl all
🍏 关于我们
连享会 ( www.lianxh.cn,推文列表) 由中山大学连玉君老师团队创办,定期分享实证分析经验。 直通车: 👉【**百度一下:**连享会】即可直达连享会主页。亦可进一步添加 「知乎」,「b 站」,「面板数据」,「公开课」 等关键词细化搜索。